// LeetCode 200 岛屿数量

// 200. 岛屿数量
// 给你一个由 '1'（陆地）和 '0'（水）组成的的二维网格，请你计算网格中岛屿的数量。

// 岛屿总是被水包围，并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

// 此外，你可以假设该网格的四条边均被水包围。

 

// 示例 1：

// 输入：grid = [
//   ["1","1","1","1","0"],
//   ["1","1","0","1","0"],
//   ["1","1","0","0","0"],
//   ["0","0","0","0","0"]
// ]
// 输出：1
// 示例 2：

// 输入：grid = [
//   ["1","1","0","0","0"],
//   ["1","1","0","0","0"],
//   ["0","0","1","0","0"],
//   ["0","0","0","1","1"]
// ]
// 输出：3
 

// 提示：

// m == grid.length
// n == grid[i].length
// 1 <= m, n <= 300
// grid[i][j] 的值为 '0' 或 '1'

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
    	int res = 0;
    	int m = grid.size(), n = grid[0].size();

    	for(int i = 0; i < m; i++) {
    		for(int j = 0; j < n; j++) {
    			if(grid[i][j] == '1') {
    				res++;
    				dfs(grid, i, j);
    			}
    		}
    	}

    	return res;
    }

    void dfs(vector<vector<char>>& grid, int i, int j) {
    	int m = grid.size(), n = grid[0].size();

    	if(i < 0 || j < 0 || i >= m || j >= n)
    		return ;

    	if(grid[i][j] != '1') 
    		return ;

    	grid[i][j] = '2';
    	dfs(grid, i - 1, j);
    	dfs(grid, i + 1, j);
    	dfs(grid, i, j + 1);
    	dfs(grid, i, j - 1);
    }
};